package com.wms.ymcc.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import springfox.documentation.swagger.web.*;

import java.util.Optional;
/**
 * @author : 阿盛哟
 * @description :SwaggerHandler 类用于处理 Swagger 的资源配置、安全配置和 UI 配置。
 * 它通过 REST 接口提供 Swagger 相关的元数据，供前端页面加载和展示 API 文档。
 * @createDate : 2025/5/24 22:50
 */

@RestController
@RequestMapping("/swagger-resources")// 定义该控制器的基础路径为 "/swagger-resources"
public class SwaggerHandler {

    /**
     * 注入 SecurityConfiguration，用于配置 Swagger 的安全选项（如 OAuth2）。
     * 如果未配置，则使用默认值。
     */
    @Autowired(required = false)
    private SecurityConfiguration securityConfiguration;

    /**
     * 注入 UiConfiguration，用于配置 Swagger UI 的显示选项（如深色模式、过滤器等）。
     * 如果未配置，则使用默认值。
     */
    @Autowired(required = false)
    private UiConfiguration uiConfiguration;

    /**
     * 注入 SwaggerResourcesProvider，用于获取 Swagger 资源列表。
     * SwaggerResourcesProvider 提供了所有可用的 API 文档资源。
     */
    private final SwaggerResourcesProvider swaggerResources;

    /**
     * 构造函数注入 SwaggerResourcesProvider。
     * @param swaggerResources Swagger 资源提供者
     */
    @Autowired
    public SwaggerHandler(SwaggerResourcesProvider swaggerResources) {
        this.swaggerResources = swaggerResources;
    }

    /**
     * 获取 Swagger 的安全配置信息。
     * 如果未定义安全配置，则返回默认的安全配置。
     * @return 包含 SecurityConfiguration 的 ResponseEntity 对象
     */
    @GetMapping("/configuration/security")
    public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {
        return Mono.just(new ResponseEntity<>(
                Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));
    }

    /**
     * 获取 Swagger UI 的配置信息。
     * 如果未定义 UI 配置，则返回默认的 UI 配置。
     * @return 包含 UiConfiguration 的 ResponseEntity 对象
     */
    @GetMapping("/configuration/ui")
    public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {
        return Mono.just(new ResponseEntity<>(
                Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
    }

    /**
     * 获取 Swagger 资源列表。
     * 该接口返回所有可用的 API 文档资源。
     * @return 包含 Swagger 资源列表的 ResponseEntity 对象
     */
    @GetMapping("")
    public Mono<ResponseEntity> swaggerResources() {
        return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
    }

}